Skip to content

Conversation

aodhgan
Copy link

@aodhgan aodhgan commented Oct 2, 2025

New RPC method eth_sendRawTransactionSync(rawTx, timeoutMs?) that submits a signed tx and blocks until a receipt is available or a timeout elapses.

Uses a ChainEvent subscription to grep receipts and filter for the receipt of interest.

Two CLI flags to tune server-side limits:

--rpc.txsync.defaulttimeout (default wait window)

--rpc.txsync.maxtimeout (upper bound; requests are clamped)

Success/timeout unit tests added.

closes #32094

@aodhgan aodhgan changed the title feat(rpc): add eth_SendRawTransactionSync internal/ethapi: add eth_SendRawTransactionSync Oct 2, 2025
@fjl fjl assigned s1na Oct 7, 2025
@s1na s1na removed the status:triage label Oct 8, 2025
@s1na
Copy link
Contributor

s1na commented Oct 8, 2025

We can do a slight refactor with this PR merged: #32697 (comment)

@s1na
Copy link
Contributor

s1na commented Oct 9, 2025

We can do a slight refactor with this PR merged: #32697 (comment)

This PR was merged ^

@aodhgan aodhgan force-pushed the ag/feat/add-ethsendRawTransactionSync branch from 0daa396 to 3a3c46a Compare October 9, 2025 19:23
@Sahil-4555
Copy link

@s1na @gawnieg
According to the EIP-7966, if a transaction is not ready to be processed, the handler should return error code 5 along with an error message. I checked the SubmitTransaction function but didn’t see this implemented—should it be added here or handling elsewhere?

@ethereumorg092-arch ethereumorg092-arch mentioned this pull request Oct 10, 2025
@aodhgan
Copy link
Author

aodhgan commented Oct 10, 2025

@s1na @gawnieg According to the EIP-7966, if a transaction is not ready to be processed, the handler should return error code 5 along with an error message. I checked the SubmitTransaction function but didn’t see this implemented—should it be added here or handling elsewhere?

The given examples (missing nonce or insufficient funds) are already covered by their own more granular codes (https://github.com/aodhgan/go-ethereum/blob/ag/feat/add-ethsendRawTransactionSync/internal/ethapi/errors.go#L102). There is an option to coalesce these into the new error code 5 but dont see much value? (Also considering the EIP says SHOULD (vs MUST)). The "node not ready to accept new transactions" seems to require a deeper set of changes? wdyt @s1na?

@Sahil-4555
Copy link

The given examples (missing nonce or insufficient funds) are already covered by their own more granular codes (https://github.com/aodhgan/go-ethereum/blob/ag/feat/add-ethsendRawTransactionSync/internal/ethapi/errors.go#L102). There is an option to coalesce these into the new error code 5 but dont see much value? (Also considering the EIP says SHOULD (vs MUST)). The "node not ready to accept new transactions" seems to require a deeper set of changes? wdyt @s1na?

Got it, that makes sense. Since the EIP says SHOULD and not MUST, it’s optional. I just wanted to check if we plan to follow that or keep using the current detailed error codes.

@s1na
Copy link
Contributor

s1na commented Oct 13, 2025

There is an option to coalesce these into the new error code 5 but dont see much value? (Also considering the EIP says SHOULD (vs MUST)). The "node not ready to accept new transactions" seems to require a deeper set of changes? wdyt @s1na?

On the nod ready-ness we could query and see if it is in sync or not, but that's not something we do for the other sendTransaction variants. I'm not sure why it was introduced to this method.

On the other point I think I agree that coalescing means losing info, and given the wording, I'd go with the current approach.

timeout time.Duration,
) (*types.Receipt, error) {
var buf bytes.Buffer
if err := tx.EncodeRLP(&buf); err != nil {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use tx.MarshalBinary

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about naming it SendTransactionSync? and the other one SendRawTransactionSync

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also I think timeout should be optional

Copy link
Author

@aodhgan aodhgan Oct 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed in 1d662b50a


case err, ok := <-subErrCh:
if !ok || err == nil {
// subscription closed; disable this case
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand why you don't return at this point? am I missing something?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

think that was a stale case from a another implementation i tried. changed in
409eea4

Comment on lines 705 to 706
tx *types.Transaction,
timeout ...time.Duration,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that means users can pass in multiple timeout parameters :) I'd make it a pointer and not pass it to the rpc call if it's nil. Or define a new method SendTransactionSyncWithTimeout and SendRawTransactionSyncWithTimeout

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

went with the pointer b05fbc1

}
}
// Otherwise, bubble the caller's context error (canceled or deadline).
if err := ctx.Err(); err != nil {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't follow why you then go with the caller's context error. Deadlines from the parent context will propagate to receiptCtx also. And receiptCtx generally might "know more" what went wrong.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I missed the fallback return. Still not clear to me why we need this condition. The receiptCtx should contain an error from its parent ctx

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

think I was trying (in vain) to distinguish between different timeouts. Updated to just using the child context error: e203026

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EIP 7966 - eth_sendRawTransactionSync

6 participants